home *** CD-ROM | disk | FTP | other *** search
/ Delphi Magazine Collection 2001 / Delphi Magazine Collection 20001 (2001).iso / DISKS / Issue35 / alfresco / CountPwr.dpr < prev    next >
Encoding:
Text File  |  1998-05-26  |  1.7 KB  |  89 lines

  1. program CountPwr;
  2.  
  3. {$IFDEF Win32}
  4. {$APPTYPE CONSOLE}
  5. {$ENDIF}
  6.  
  7. uses
  8.   {$IFDEF Win32}
  9.   Windows;
  10.   {$ELSE}
  11.   WinCrt, WinTypes, WinProcs;
  12.   {$ENDIF}
  13.  
  14. var
  15.   PowerCount : integer;
  16.   MultCount  : integer;
  17.  
  18. function CleanFastPower(X : double; N : cardinal) : double;
  19. begin
  20.   Result := 1.0;
  21.   if (N = 0) then Exit;
  22.   while true do begin
  23.     if Odd(N) then
  24.       Result  := X * Result;
  25.     if (N = 1) then Exit;
  26.     X := X * X;
  27.     N := N div 2;
  28.   end;
  29. end;
  30.  
  31. function FastPower(X : double; N : cardinal) : double;
  32. var
  33.   Finished : boolean;
  34. begin
  35.   Result := 1.0;
  36.   Finished := false;
  37.   while not Finished do begin
  38.     if (N = 0) then begin
  39.       Finished := true;
  40.     end
  41.     else if (N = 1) then begin
  42.       Result := X * Result;
  43.       Finished := true;
  44.     end
  45.     else begin
  46.       if Odd(N) then begin
  47.         Result := X * Result;
  48.         X := X * X;
  49.         N := (N-1) div 2;
  50.       end
  51.       else {N is even} begin
  52.         X := X * X;
  53.         N := N div 2;
  54.       end;
  55.     end;
  56.   end;
  57. end;
  58.  
  59. function Power(X : double; N : cardinal) : double;
  60. begin
  61.   inc(PowerCount);
  62.   if (N = 0) then
  63.     Result := 1.0
  64.   else if (N = 1) then
  65.     Result := X
  66.   else begin
  67.     Inc(MultCount);
  68.     if Odd(N) then begin
  69.       Inc(MultCount);
  70.       Result := Power(X*X, (N-1) div 2) * X
  71.     end
  72.     else {N is even}
  73.       Result := Power(X*X, N div 2);
  74.   end;
  75. end;
  76.  
  77. begin
  78.   PowerCount := 0;
  79.   MultCount := 0;
  80.   writeln('1.2^50 = ', Power(1.2, 50):15:9);
  81.   writeln('Calls made: ', PowerCount);
  82.   writeln('Multiplies done: ', MultCount);
  83.   writeln('1.2^64 = ', Power(1.2, 64):15:9);
  84.   writeln('1.2^64 = ', FastPower(1.2, 64):15:9);
  85.   writeln('1.2^64 = ', CleanFastPower(1.2, 64):15:9);
  86.  
  87.   readln;
  88. end.
  89.